Чаще всего виджет показывается при нажатии горячих клавиш или кнопки в баре на подобии waybar. Один из способов скрывать/показывать виджет, это отправлять ему Posix сигнал, например так:
pkill -USR1 -f hypr_calendar_widget
Реализуем обработку сигнала USR1:
Добавим статическую переменную в Application.vala для хранения в ней окна виджета
private static HyprCalendar.MainWindow _window;
в методе activate заменим локальную переменную window на статическую _window
public override void activate() {
_window = new MainWindow(this);
GtkLayerShell.init_for_window(_window);
GtkLayerShell.set_layer(_window, GtkLayerShell.Layer.TOP);
GtkLayerShell.set_namespace(_window, "HyprCalendar");
GtkLayerShell.set_anchor(
_window,
GtkLayerShell.Edge.TOP,
true
);
_window.present();
}
добавим статический метод change_visibility
private static void change_visibility(){
if(_window != null){
_window.set_visible(!_window.get_visible());
}
}
в функции main добавим вызов метода change_visibility при получении Posix сигнала USR1
public static int main() {
var application = new HyprCalendar.Application();
Posix.signal(Posix.Signal.USR1, change_visibility);
return application.run();
}
полный листинг Application.vala:
using GLib;
using Gtk;
using GtkLayerShell;
public class HyprCalendar.Application: Gtk.Application {
private static HyprCalendar.MainWindow _window;
public Application() {
Object(application_id: "com.github.HyprCalendar");
}
public override void activate() {
_window = new MainWindow(this);
GtkLayerShell.init_for_window(_window);
GtkLayerShell.set_layer(_window, GtkLayerShell.Layer.TOP);
GtkLayerShell.set_namespace(_window, "HyprCalendar");
GtkLayerShell.set_anchor(
_window,
GtkLayerShell.Edge.TOP,
true
);
_window.present();
}
public static int main() {
var application = new HyprCalendar.Application();
Posix.signal(Posix.Signal.USR1, change_visibility);
return application.run();
}
private static void change_visibility(){
if(_window != null){
_window.set_visible(!_window.get_visible());
}
}
}
Соберём проект
ninja -C build
запустим проект
./build/hypr_calendar_widget
откроем ещё одну вкладку в консоли или ещё одну консоль, кому как удобнее и в ней отправим сигнал нашему виджету:
pkill -USR1 -f hypr_calendar_widget
окно скроется. При повторной отправке сигнала окно снова появится.
Скрытый по умолчанию виджет
Есть виджеты которые при запуске не показываются сразу, а ждут сигнал. Для того чтобы это сделать нам нужно добавить в метод activate сокрытие окна _window.set_visible(false);
public override void activate() {
_window = new MainWindow(this);
GtkLayerShell.init_for_window(_window);
GtkLayerShell.set_layer(_window, GtkLayerShell.Layer.TOP);
GtkLayerShell.set_namespace(_window, "HyprCalendar");
GtkLayerShell.set_anchor(
_window,
GtkLayerShell.Edge.TOP,
true
);
_window.present();
_window.set_visible(false);// скрываем окно после запуска
}
Соберём проект
ninja -C build
запустим проект
./build/hypr_calendar_widget
окно не покажется пока мы не отправим сигнал
pkill -USR1 -f hypr_calendar_widget